#define _CRT_SECURE_NO_WARNINGS 1

/*
		文件操作函数练习

		夏思成

		2024年4月16日

		西科大15号公寓楼
*/

//fprintf函数的使用
//将格式化数据写入文件中

//#include <stdio.h>
//
//struct S
//{
//	char name[20];
//	int age;
//	float weight;
//};
//
//int main()
//{
//	struct S a = { "zhangsan",18,65.0f };
//
//	//打开文件
//	FILE* pf = fopen("test.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return -1;
//	}
//
//	//操作文件，利用fprintf将结构体变量的内容写入文件中
//	fprintf(pf, "%s %d %f", a.name, a.age, a.weight);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//fscanf函数的使用
//从文件中以格式化读取数据

//#include <stdio.h>
//
//struct S
//{
//	char name[20];
//	int age;
//	float weight;
//};
//
//int main()
//{
//	struct S a = {0};
//
//	//打开文件
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return -1;
//	}
//
//	//操作文件，利用fscanf将文件中的数据格式化输入到结构体中
//	fscanf(pf, "%s %d %f", a.name, &(a.age), &(a.weight));
//
//	printf("%s %d %f", a.name, a.age, a.weight);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//fwrite函数的使用
//将数据以二进制形式写入文件中
//函数原型：size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream);
//ptr:指向要被写入文件中的数组的元素的地址
//size：数组元素的大小
//count：数组元素个数
//stream:要被写入的文件

//#include <stdio.h>
//
//int main()
//{
//	int arr[5] = { 1,2,3,4,5 };
//
//	//打开文件
//	FILE* pf = fopen("test.txt", "wb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return -1;
//	}
//
//	//文件操作
//	fwrite(arr, sizeof(int), 5, pf);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//fread函数的使用
//将文件中的二进制数据输出
//函数原型：size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
//ptr：只想一块内存大小至少为（size*count）的空间
//size：文件中数据的大小
//count：数据的个数
//stream：读取数据的文件

//#include <stdio.h>
//#include <stdlib.h>
//
//int main()
//{
//	int* arr = (int*)malloc(sizeof(int) * 5);
//	if (arr == NULL)
//	{
//		perror("malloc");
//		return -1;
//	}
//
//	//打开文件
//	FILE* pf = fopen("test.txt", "rb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return -1;
//	}
//
//	//操作文件
//	//法一：
//	/*int i = 0;
//	while (fread(arr+i, sizeof(int), 1, pf))
//	{
//		printf("%d ", arr[i]);
//		i++;
//	}*/
//	//法二：
//	fread(arr, sizeof(int), 5, pf);
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	free(arr);
//	arr = NULL;
//	return 0;
//}


//sprintf的函数使用
//将格式化数据写入字符串中
//函数原型：int sprintf ( char * str, const char * format, ... );

//#include <stdio.h>
//
//struct S
//{
//	char name[20];
//	int age;
//	float weight;
//};
//
//int main()
//{
//	char str[200] = { 0 };
//	struct S s = { "zhangsan",19,65.5f };
//	sprintf(str, "%s %d %f", s.name, s.age, s.weight);
//	printf("%s\n", str);
//	return 0;
//}

//sscanf函数的使用
//从字符串中获取格式化数据

//#include <stdio.h>
//
//struct S
//{
//	char name[20];
//	int age;
//	float weight;
//};
//
//int main()
//{
//	char str[200] = "zhangsan 19 65.5";
//	struct S s = {0};
//	sscanf(str, "%s %d %f", s.name, &(s.age), &(s.weight));
//	printf("%s %d %f", s.name, s.age, s.weight);
//	return 0;
//}



//文件的随机读取

//fseek：根据文件指针的位置和偏移量来定位文件指针
//函数原型：int fseek ( FILE * stream, long int offset, int origin );
//stream：文件指针
//offset：偏移量以origin为标准
//origin：三种选择：SEEK_SET->文件起始位置；SEEK_CUR->目前为止;SEEK_END->文件结尾。

//#include <stdio.h>
//
//int main()
//{
//	//该文件中已经存放了abcdefghi
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return -1;
//	}
//
//	//取a
//	int ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	//取f
//	fseek(pf, 5, SEEK_SET);//将文件指针指向据SEEK_SET偏移量为5的地方
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}



//ftell函数
//返回文件指针相对于起始位置的偏移量
//函数原型：long int ftell ( FILE * stream );

//#include <stdio.h>
//
//int main()
//{
//	//该文件中已经存放了abcdefghi
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return -1;
//	}
//
//	//取a
//	int ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	//取出a后，文件指针走向下一个位置，相对起始位置的偏移量应该为1
//	int offset = ftell(pf);
//	printf("%d\n", offset);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//#include <stdio.h>
//#include <stdlib.h>
//
//int main()
//{
//	int* arr = (int*)malloc(2*INT_MAX);
//	perror("malloc");
//	return 0;
//}


//fewind
//让文件指针的位置回到文件的起始位置

#include <stdio.h>

int main()
{
	//该文件中已经存放了abcdefghi
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	//取f
	fseek(pf, 5, SEEK_SET);//使文件指针指向f
	int ch = fgetc(pf);
	printf("%c\n", ch);

	//打印f后又想打印a怎么办呢？
	//使用rewind函数，使文件指针重新指向起始位置
	rewind(pf);
	printf("%c\n", fgetc(pf));

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}